package cz.vse.adventura.po1715.xskrz00_skrivankova.gui;

import cz.vse.adventura.po1715.xskrz00_skrivankova.data.DataPkg;

import cz.pecinovsky.english.pojj.adv_framework.game_gui.IGameG;
import cz.pecinovsky.english.pojj.adv_framework.game_gui.IListener;
import cz.pecinovsky.english.pojj.adv_framework.game_gui.IPlaceG;
import java.awt.Point;
import java.net.URL;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

/*******************************************************************************
 * Instance třídy {@code GamePlan} okno zobrazující plánek místností
 *
 * @author    Zuzana SKŘIVÁNKOVÁ
 * @version   1.00.000
 */
public class GamePlan implements IListener<IPlaceG> {
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
    
    
    
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
    /** Hra, kterou GUI používá */
    //private final IGameG game;
    
    /** Okno s plánem hry */
    private final JFrame planWindow = new JFrame("Plán hry");
    
    /*GUI, které s oknem pracuje */
    private final GUI_04 gui;
    
    /** Label s plánkem hry */
    private final JLabel planLabel;
    
    /** URL obrázku hráče */
    private final URL playerImgURL;
    
    /** Ikona hráče */
    private final Icon playerIcon;
    
    /** Label s ikonou hráče */
    private final JLabel playerLabel;
    
    
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================
    /***************************************************************************
     *
     */
    public GamePlan(GUI_04 gui) {
        this.gui = gui;
        planWindow.setLayout(null);
        
         /** Plánek */
        planLabel = new JLabel();
        
        playerImgURL = DataPkg.class.getResource("Alenka.png");
        playerIcon = new ImageIcon(playerImgURL);
        playerLabel = new JLabel(playerIcon);
        playerLabel.setBounds(0, 0, playerIcon.getIconWidth(), playerIcon.getIconHeight());                
        
        planWindow.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        
        planWindow.add(playerLabel);
       
        planWindow.add(planLabel);
    }
//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
    
    /***************************************************************************
     * Nastaví viditelnost plánku místností
     *
     * @param planState - boolean hodnota viditelnosti
     */
    void setVisible(Boolean planState) {
        planWindow.setVisible(planState);
    }
    
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================
    
    /***************************************************************************
     * Hlášeni o výskytu očekávané události.
     *
     * @param actualPlace Objekt, který je schopen poskytnout informace 
     *                  o události, kterou zavolání dané metody ohlašuje
     */
    public void notice(IPlaceG actualPlace) {
        movePlayer();
    }
    
    /***************************************************************************
     * Připraví nové okno, které zobrazuje plánek místností
     */
    void initialize() {
        IGameG game = gui.getGame();
        game.addNeighborsListener(this);
        
        /** Nastavení souřadnic okna */
        int yCoordinate = gui.getAppWindowYPos() + gui.getAppWindowHeight();
        planWindow.setLocation(0, yCoordinate);
        
        Icon plan = game.getMap();
        planLabel.setIcon(plan);
        planLabel.setBounds(0, 0, plan.getIconWidth(), plan.getIconHeight());
        
        planWindow.setSize(plan.getIconWidth() + 20, plan.getIconHeight() + 40);
     
        planWindow.setVisible(true);
    }
    
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
    /***************************************************************************
     * Umístí hráče na novou pozici na plánku
     */
    private void movePlayer() {
        Point position = gui.getGame().getActualPlace().getPosition();
        playerLabel.setLocation(position);

    }
    
    
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTY A METODA MAIN =======================================================
    
}
